﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluorineFx;
using System.Data;
using System.Collections.ObjectModel;

namespace CasasJusticia.Messaging.Contexto.CasasJusticia
{
    [RemotingService("DivisionMunicipal")]
    public class DivisionMunicipal
    {
        #region Miembros de Datos

        private string _nombreVistaEntidades = "CasasJusticia.dbo.View_EntidadesPorCasasGeo";

        private string _consultaEntidadesPorIdsCasasJusticia;

        private string _nombreTabla = "CasasJusticia.Casas.DivisionMunicipal";

        private string _consultaDivMunicipalPorIdsCasasJusticia;

        #endregion

        #region Constructor

        public DivisionMunicipal()
        {
            this._consultaDivMunicipalPorIdsCasasJusticia = string.Format("SELECT DISTINCT(loc.IdDivisionMunicipal), loc.*  FROM {0} as vista, {1} as loc WHERE vista.IdCasaJusticia IN (*0) AND vista.IdMunicipio = '*1' AND vista.IdDivisionMunicipal = loc.IdDivisionMunicipal ORDER BY NomDivisionMunicipal", this._nombreVistaEntidades, this._nombreTabla);
            this._consultaDivMunicipalPorIdsCasasJusticia = this._consultaDivMunicipalPorIdsCasasJusticia.Replace("*0", "{0}");
            this._consultaDivMunicipalPorIdsCasasJusticia = this._consultaDivMunicipalPorIdsCasasJusticia.Replace("*1", "{1}");

            this._consultaEntidadesPorIdsCasasJusticia = string.Format("SELECT DISTINCT vista.IdCasaJusticia, vista.NomEntidad  FROM {0} as vista WHERE vista.IdCasaJusticia IN (*0) AND vista.IdMunicipio = *1 AND vista.IdDivisionMunicipal = *2 ORDER BY vista.NomEntidad", this._nombreVistaEntidades, this._nombreTabla);
            this._consultaEntidadesPorIdsCasasJusticia = this._consultaEntidadesPorIdsCasasJusticia.Replace("*0", "{0}");
            this._consultaEntidadesPorIdsCasasJusticia = this._consultaEntidadesPorIdsCasasJusticia.Replace("*1", "{1}");
            this._consultaEntidadesPorIdsCasasJusticia = this._consultaEntidadesPorIdsCasasJusticia.Replace("*2", "{2}");
        }

        #endregion

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idDepartamento"></param>
        /// <param name="idMunicipio"></param>
        /// <param name="idEntidad"></param>
        /// <param name="idCasasJusticia"></param>
        /// <returns></returns>
        public string ConsultarCasasJusticia(string idDepartamento, string idMunicipio, string idDivisionMunicipal, int idEntidad, Array idCasasJusticia)
        {
            try
            {
                Collection<EntidadPorCasa> entidadesPorCasasJusticia = Utilidades.EntidadesPorCasa();

                List<int> codigosCasasJusticia = Utilidades.ArmarListaValoresDeArray(idCasasJusticia);

                if (idEntidad < 0)
                {
                    var queryEntidadesPorCasasJusticia = (from entidadPorCasa in entidadesPorCasasJusticia
                                                          where codigosCasasJusticia.Contains(entidadPorCasa.IdCasaJusticia)
                                                          //&& entidadPorCasa.IdDepartamento.Equals(idDepartamento)
                                                          && entidadPorCasa.IdMunicipio.Equals(idMunicipio)
                                                          && entidadPorCasa.IdLocalidad == Convert.ToInt32(idDivisionMunicipal)
                                                          select entidadPorCasa.IdCasaJusticia).Distinct().ToList();

                    return Utilidades.ArmarCadenaValoresList(queryEntidadesPorCasasJusticia);
                }
                else
                {
                    var queryEntidadesPorCasasJusticia = (from entidadPorCasa in entidadesPorCasasJusticia
                                                          where codigosCasasJusticia.Contains(entidadPorCasa.IdCasaJusticia)
                                                          //&& entidadPorCasa.IdDepartamento.Equals(idDepartamento)
                                                          && entidadPorCasa.IdMunicipio.Equals(idMunicipio)
                                                          && entidadPorCasa.IdLocalidad == Convert.ToInt32(idDivisionMunicipal)
                                                          && entidadPorCasa.IdEntidad == idEntidad                                                          
                                                          select entidadPorCasa.IdCasaJusticia).Distinct().ToList();

                    return Utilidades.ArmarCadenaValoresList(queryEntidadesPorCasasJusticia);
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        #region Procedimientos y Funciones

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idMunicipio"></param>
        /// <param name="idCasasJusticia"></param>
        /// <returns></returns>
        [DataTableType("CasasJusticia.Modelo.DivisionMunicipal")]
        public DataTable ConsultaDivMunicipalPorMpio(string idMunicipio, Array idCasasJusticia)
        {
            try
            {
                /*if (idCasasJusticia == null)
                    return null;
                if (idCasasJusticia.Length <= 0)
                    return null;
                string codigos = string.Join(",", idCasasJusticia.Cast<string>().ToArray());
                string sql = string.Format(this._consultaDivMunicipalPorIdsCasasJusticia, codigos, idDivisionMunicipal);

                Consulta consulta = new Consulta();
                DataTable resultado = consulta.Ejecutar(sql);
                 
                 return resultado;
                 */

                if (string.IsNullOrEmpty(idMunicipio))
                    return Utilidades.ConsultaToDataTable<Jurisdicciones.DivisionMunicipal>(new Collection<Jurisdicciones.DivisionMunicipal>());

                Collection<EntidadPorCasa> entidadesPorCasasJusticia = Utilidades.EntidadesPorCasa();

                List<int> codigosCasasJusticia = Utilidades.ArmarListaValoresDeArray(idCasasJusticia);

                var queryLocalidades = from entidadPorCasa in entidadesPorCasasJusticia
                                       where codigosCasasJusticia.Contains(entidadPorCasa.IdCasaJusticia) && entidadPorCasa.IdMunicipio.Equals(idMunicipio)
                                       && entidadPorCasa.TieneLocalidades.Equals("S")
                                       group entidadPorCasa by new { IdLocalidad = entidadPorCasa.IdLocalidad, NomLocalidad = entidadPorCasa.NomLocalidad } into loc
                                       orderby loc.Key.NomLocalidad
                                       select new Jurisdicciones.DivisionMunicipal
                                       {
                                           IdDepartamento = entidadesPorCasasJusticia.Where(x => x.IdLocalidad == loc.Key.IdLocalidad).Select(x => x.IdDepartamento).FirstOrDefault(),
                                           IdMunicipio = entidadesPorCasasJusticia.Where(x => x.IdLocalidad == loc.Key.IdLocalidad).Select(x => x.IdMunicipio).FirstOrDefault(),                                             
                                           IdDivisionMunicipal = string.Concat("", loc.Key.IdLocalidad),
                                           NomDivisionMunicipal = string.Concat("", loc.Key.NomLocalidad),
                                       };

                return Utilidades.ConsultaToDataTable<Jurisdicciones.DivisionMunicipal>(queryLocalidades.ToArray());
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idMunicipio"></param>
        /// <param name="idCasasJusticia"></param>
        /// <returns></returns>
        [DataTableType("CasasJusticia.Modelo.EntidadPorCasaGeo")]
        public DataTable ConsultarEntidades(string idMunicipio, string idDivisionMunicipal, Array idCasasJusticia)
        {
            try
            {
                /*if (idCasasJusticia == null)
                    return null;
                if (idCasasJusticia.Length <= 0)
                    return null;
                string codigos = string.Join(",", idCasasJusticia.Cast<string>().ToArray());
                string sql = string.Format(this._consultaEntidadesPorIdsCasasJusticia, codigos, idMunicipio, idDivisionMunicipal);

                Consulta consulta = new Consulta();

                DataTable resultado = consulta.Ejecutar(sql);
                return resultado;*/

                Collection<EntidadPorCasa> entidadesPorCasasJusticia = Utilidades.EntidadesPorCasa();

                List<int> codigosCasasJusticia = Utilidades.ArmarListaValoresDeArray(idCasasJusticia);

                int idLocalidad = !string.IsNullOrEmpty(idDivisionMunicipal) ? Convert.ToInt32(idDivisionMunicipal) : 0;

                var queryEntidadesPorCasasJusticia = from entidadPorCasa in entidadesPorCasasJusticia
                                                     where codigosCasasJusticia.Contains(entidadPorCasa.IdCasaJusticia) && entidadPorCasa.IdMunicipio.Equals(idMunicipio) && entidadPorCasa.IdLocalidad == idLocalidad
                                                     group entidadPorCasa by new { IdEntidad = entidadPorCasa.IdEntidad, NomEntidad = entidadPorCasa.NomEntidad } into entidad
                                                     orderby entidad.Key.NomEntidad
                                                     select new EntidadPorCasa
                                                     {
                                                         EstEntidad = entidad.FirstOrDefault().EstEntidad,
                                                         EstEntidadCasa = entidad.FirstOrDefault().EstEntidadCasa,
                                                         IdCasaJusticia = entidad.FirstOrDefault().IdCasaJusticia,
                                                         IdDepartamento = entidad.FirstOrDefault().IdDepartamento,
                                                         IdEntidad = entidad.Key.IdEntidad,
                                                         IdEntidadCasa = entidad.FirstOrDefault().IdEntidadCasa,
                                                         IdLocalidad = entidad.FirstOrDefault().IdLocalidad,
                                                         IdMunicipio = entidad.FirstOrDefault().IdMunicipio,
                                                         NomCasaJusticia = entidad.FirstOrDefault().NomCasaJusticia,
                                                         NomDepartamento = entidad.FirstOrDefault().NomDepartamento,
                                                         NomEntidad = entidad.Key.NomEntidad,
                                                         NomLocalidad = entidad.FirstOrDefault().NomLocalidad,
                                                         NomMunicipio = entidad.FirstOrDefault().NomMunicipio,
                                                         TieneLocalidades = entidad.FirstOrDefault().TieneLocalidades,
                                                         TipoCasaJusticia = entidad.FirstOrDefault().TipoCasaJusticia
                                                     };

                foreach (var q in queryEntidadesPorCasasJusticia)
                    System.Diagnostics.Debug.WriteLine(string.Format("Id Dpto '{0}', Id Mpio '{1}', Id Localidad: '{2}', Id Casa Justicia '{3}'", q.IdDepartamento, q.IdMunicipio, q.IdLocalidad, q.IdCasaJusticia));

                return Utilidades.ConsultaToDataTable<EntidadPorCasa>(queryEntidadesPorCasasJusticia.ToArray());
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        #endregion

    }
}